package com.weigecoder.warehouse.service.impl;

import com.weigecoder.warehouse.constant.WarehouseConstants;
import com.weigecoder.warehouse.entity.Product;
import com.weigecoder.warehouse.entity.Result;
import com.weigecoder.warehouse.exception.BusinessException;
import com.weigecoder.warehouse.mapper.ProductMapper;
import com.weigecoder.warehouse.page.Page;
import com.weigecoder.warehouse.service.ProductService;
import com.weigecoder.warehouse.utils.QiniuUploadUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.util.List;

@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private QiniuUploadUtil qiniuUploadUtil;

    //分页查询商品的业务方法
    @Override
    public Page queryProductPage(Page page, Product product) {
        //查询商品总行数
        int productCount = productMapper.selectProductCount(product);
        //分页查询商品
        List<Product> productList = productMapper.selectProductPage(page, product);
        //将查询到的总行数和当前页数据组装到Page对象
        page.setTotalNum(productCount);
        page.setResultList(productList);
        return page;
    }

    /*
      将配置文件的file.access-path属性值注入给service的accessPath属性,
     * 其为上传的图片保存到数据库中的访问地址的目录路径/img/upload/;
     */
    /*@Value("${file.access-path}")
    private String accessPath;*/

    @Autowired
    private StringRedisTemplate redisTemplate;

    //添加商品的业务方法
    @Override
    public Result saveProduct(Product product) {
        //处理上传的图片的访问地址 -- /img/upload/图片名称
        // product.setImgs(accessPath+product.getImgs());
        //添加商品
        int i = productMapper.insertProduct(product);
        if (i > 0) {
            //将保存成功到数据库的图片保存一份到redis的set集合中
            redisTemplate.boundSetOps(WarehouseConstants.PRODUCT_IMAGES_DB_RESOURCES).add(product.getImgs());
            return Result.ok("添加商品成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "添加商品失败！");
    }

    //修改商品上下架状态的业务方法
    @Override
    public Result updateProductState(Product product) {
        //根据商品id修改商品上下架状态
        int i = productMapper.updateStateById(product);
        if (i > 0) {
            return Result.ok("修改成功！");
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "修改失败！");
    }

    //删除商品的业务方法
    @Override
    public Result deleteProduct(Integer productId) {
        Product product = productMapper.selectProductById(productId);
        if (ObjectUtils.isEmpty(product)) {
            return Result.err(Result.CODE_ERR_BUSINESS, "服务器繁忙，请稍后重试...");
        }
        //删除七牛云中的图片
        //删除redis中的商品图片
        String imgs = null;
        try {
            imgs = product.getImgs();
            if (!StringUtils.hasText(imgs)) {
                qiniuUploadUtil.deleteFileFromQiniu(imgs);
                redisTemplate.delete(imgs);
                //删除存入db中的图片，之后定时任务会自动清理垃圾图片
                redisTemplate.boundSetOps(WarehouseConstants.PRODUCT_IMAGES_DB_RESOURCES).remove(imgs);
            }
            //根据商品id删除商品
            int i = productMapper.deleteProductById(productId);
            if (i > 0) return Result.ok("商品删除成功！");
        } catch (Exception e) {
            throw new BusinessException();
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "商品删除失败！");
    }

    //批量删除商品
    @Override
    public Result removeProductByBatch(List<Integer> productIds) {
        try {
            for (Integer productId : productIds) {
                Product product = productMapper.selectProductById(productId);
                String productImgs = product.getImgs();
                qiniuUploadUtil.deleteFileFromQiniu(productImgs);
                redisTemplate.delete(productImgs);
                //删除存入db中的图片，之后定时任务会自动清理垃圾图片
                redisTemplate.boundSetOps(WarehouseConstants.PRODUCT_IMAGES_DB_RESOURCES).remove(productImgs);
                int i = productMapper.deleteProductById(productId);
                if (i<=0){
                    return Result.err(Result.CODE_ERR_BUSINESS, "商品删除失败！");
                }
            }
            return Result.ok("商品删除成功！");
        } catch (Exception e) {
            return Result.err(Result.CODE_ERR_BUSINESS, "商品删除失败！");
        }
    }

    //修改商品的业务方法
    @Override
    public Result updateProduct(Product product) {

        /*
          处理商品上传的图片的访问地址:
          如果product对象的imgs属性值没有以/img/upload/开始,说明商品的图片
          被修改了即上传了新的图片,那么product对象的imgs属性值只是图片的名称,
          则给图片名称前拼接/img/upload构成商品新上传的图片的访问地址;
         */
        /*if(!product.getImgs().startsWith(accessPath)){
            product.setImgs(accessPath+product.getImgs());
        }*/

        try {
            Product selectProductById = productMapper.selectProductById(product.getProductId());
            if (StringUtils.hasText(product.getImgs())) {
                //用户了上传图片
                //根据商品id修改商品信息
                String upload_image = redisTemplate.opsForValue().get(WarehouseConstants.UPLOAD_FILENAME_KEY);
                product.setImgs(upload_image);
                int i = productMapper.updateProductById(product);
                if (i > 0) {
                    //删除原先的图片
                    redisTemplate.boundSetOps(WarehouseConstants.PRODUCT_IMAGES_DB_RESOURCES).remove(selectProductById.getImgs());
                    //添加到存到db中的set集合
                    redisTemplate.boundSetOps(WarehouseConstants.PRODUCT_IMAGES_DB_RESOURCES).add(product.getImgs());
                    return Result.ok("商品修改成功！");
                }
            } else {
                //用户没有上传图片，用原来的图片
                if (ObjectUtils.isEmpty(selectProductById)) {
                    return Result.err(Result.CODE_ERR_BUSINESS, "服务器繁忙，请稍后重试...");
                }
                product.setImgs(selectProductById.getImgs());
                int i = productMapper.updateProductById(product);
                if (i > 0) return Result.ok("商品修改成功！");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException();
        }
        return Result.err(Result.CODE_ERR_BUSINESS, "商品修改失败！");
    }
}
